#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Mikan Session Package

Mikan Python Web Framework
"""

__author__ = "K.Sonohara"
__status__ = "develop"
__version__ = "0.0.0_30"
__date__    = "2013/09/01"
__license__ = 'LGPL'

# ------------------------------------------------------------
## Import Section
# ------------------------------------------------------------
# Python
import traceback

# beaker
try:
	from beaker.middleware import SessionMiddleware
	isbeaker = True
except:
	isbeaker = False

# ESiPC
from esipc import ESiPCProperty

# Mikan
from mikan.core import AbstractMikan, MIKAN_HTTP_HEADER

# ------------------------------------------------------------
## Variable Section
# ------------------------------------------------------------

# ------------------------------------------------------------
## Function Section
# ------------------------------------------------------------

# ------------------------------------------------------------
## Class Section
# ------------------------------------------------------------
class AbstractMikanSession(AbstractMikan):

	# ----------------------------------------------------
	## マップ プロパティ
	def get_values(self):
		return None

	# ----------------------------------------------------
	## Webアプリケーション プロパティ
	def get_webapp(self):
		return self.FWebapp

	# ----------------------------------------------------
	## コンストラクタ
	#  @param self クラス自身
	#  @param webapp Webアプリケーション
	def __init__(self, webapp):
		self.FWebapp = webapp

		super(AbstractMikanSession, self).__init__()

	# ----------------------------------------------------
	## Property
	values = ESiPCProperty(get_values, None, None)
	webapp = ESiPCProperty(get_webapp, None, None)

# ------------------------------------------------------------
## ユーザ セッション クラス
#
class MikanUserSession(AbstractMikanSession):
	# ----------------------------------------------------
	## マップ プロパティ
	def get_values(self):
		return self.session

	# ----------------------------------------------------
	## セッション プロパティ
	def get_session(self):
		return self.FSession

	# ----------------------------------------------------
	## リクエスト プロパティ
	def get_request(self):
		return self.FRequest

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	def __init__(self, r):
		self.FRequest = r

		super(MikanUserSession, self).__init__(r.webapp)

		# beakerインストール済
		try:
			if (isbeaker):
				self.FSession = r.environ.get('beaker.session')
			else:
				self.FSession = {}
		except:
			self.FSession = {}

	# ----------------------------------------------------
	## セッション保存
	def save_session(self):
		if (isbeaker):
			self.session.save()

	def logout_session(self):
		if (isbeaker):
			self.session.delete()
		self.request.headers[MIKAN_HTTP_HEADER.NAME_SET_COOKIE] = str(MIKAN_HTTP_HEADER.VALUE_TIMEOUT_SET_COOKIE)

	# ----------------------------------------------------
	## Property
	session = ESiPCProperty(get_session, None, None)
	request = ESiPCProperty(get_request, None, None)

# ------------------------------------------------------------
## ユーザ セッション クラス
#
class MikanSiteSession(AbstractMikanSession):
	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	def __init__(self, webapp):
		super(MikanSiteSession, self).__init__(webapp)

# ------------------------------------------------------------
## Main Section
# ------------------------------------------------------------
if __name__ == '__main__':
	pass

# ------------------------------------------------------------
